using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._3DAnalystTools._AreaandVolume
{
    /// <summary>
    /// <para>Surface Difference</para>
    /// <para>Calculate the displacement between two surfaces to determine where one is above, below or the same as the other surface.</para>
    /// <para>计算两个曲面之间的位移，以确定一个曲面位于另一个曲面的上方、下方或相同的位置。</para>
    /// </summary>    
    [DisplayName("Surface Difference")]
    public class SurfaceDifference : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public SurfaceDifference()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_surface">
        /// <para>Input Surface</para>
        /// <para>The triangulated surface whose relative displacement is being evaluated from the reference surface.</para>
        /// <para>从参照曲面评估其相对位移的三角化曲面。</para>
        /// </param>
        /// <param name="_in_reference_surface">
        /// <para>Reference Surface</para>
        /// <para>The triangulated surface that will be used as the baseline for determining the relative displacement of the input surface.</para>
        /// <para>将用作确定输入曲面相对位移的基线的三角化曲面。</para>
        /// </param>
        /// <param name="_out_feature_class">
        /// <para>Output Feature Class</para>
        /// <para>The output feature class containing contiguous triangles and triangle parts that have the same classification grouped into polygons. The volume enclosed by each region of difference is listed in the attribute table.</para>
        /// <para>输出要素类包含连续三角形和三角形部分，这些三角形和三角形部分具有相同的分类，分组为面。属性表中列出了每个差异区域所包含的体积。</para>
        /// </param>
        public SurfaceDifference(object _in_surface, object _in_reference_surface, object _out_feature_class)
        {
            this._in_surface = _in_surface;
            this._in_reference_surface = _in_reference_surface;
            this._out_feature_class = _out_feature_class;
        }
        public override string ToolboxName => "3D Analyst Tools";

        public override string ToolName => "Surface Difference";

        public override string CallName => "3d.SurfaceDifference";

        public override List<string> AcceptEnvironments => ["XYDomain", "XYResolution", "XYTolerance", "autoCommit", "configKeyword", "extent", "geographicTransformations", "outputCoordinateSystem", "terrainMemoryUsage", "workspace"];

        public override object[] ParameterInfo => [_in_surface, _in_reference_surface, _out_feature_class, _pyramid_level_resolution, _reference_pyramid_level_resolution, _out_raster, _raster_cell_size, _out_tin_folder, _out_tin_basename, _method.GetGPValue(), _reference_method.GetGPValue(), _extent, _boundary];

        /// <summary>
        /// <para>Input Surface</para>
        /// <para>The triangulated surface whose relative displacement is being evaluated from the reference surface.</para>
        /// <para>从参照曲面评估其相对位移的三角化曲面。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Surface")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_surface { get; set; }


        /// <summary>
        /// <para>Reference Surface</para>
        /// <para>The triangulated surface that will be used as the baseline for determining the relative displacement of the input surface.</para>
        /// <para>将用作确定输入曲面相对位移的基线的三角化曲面。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Reference Surface")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_reference_surface { get; set; }


        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para>The output feature class containing contiguous triangles and triangle parts that have the same classification grouped into polygons. The volume enclosed by each region of difference is listed in the attribute table.</para>
        /// <para>输出要素类包含连续三角形和三角形部分，这些三角形和三角形部分具有相同的分类，分组为面。属性表中列出了每个差异区域所包含的体积。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_feature_class { get; set; }


        /// <summary>
        /// <para>Analysis Resolution</para>
        /// <para>The resolution that will be used to generate the input surface. For a terrain dataset, this will correspond to its pyramid-level definitions, where the default of 0 represents full resolution. For a LAS dataset, this value represents the length of each side of the square area that will be used to thin the LAS point returns.</para>
        /// <para>将用于生成输入曲面的分辨率。对于地形数据集，这将对应于其金字塔级定义，其中默认值 0 表示全分辨率。对于 LAS 数据集，此值表示将用于缩小 LAS 点返回的正方形区域每边的长度。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Analysis Resolution")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _pyramid_level_resolution { get; set; } = 0;


        /// <summary>
        /// <para>Reference Analysis Resolution</para>
        /// <para>The resolution that will be used to generate the reference surface. For a terrain dataset, this will correspond to its pyramid-level definitions, where the default of 0 represents full resolution. For a LAS dataset, this value represents the length of each side of the square area that will be used to thin the LAS points returns.</para>
        /// <para>将用于生成参照曲面的分辨率。对于地形数据集，这将对应于其金字塔级定义，其中默认值 0 表示全分辨率。对于 LAS 数据集，此值表示将用于缩小 LAS 点返回值的正方形区域每边的长度。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Reference Analysis Resolution")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _reference_pyramid_level_resolution { get; set; } = 0;


        /// <summary>
        /// <para>Output Raster</para>
        /// <para>The output raster surface whose values represent the input surface normalized against the reference surface. Positive values reflect areas where the input surface is above the reference surface, whereas negative values indicate the areas where the input surface is below the reference surface. The raster's values are derived from a TIN using linear interpolation.</para>
        /// <para>输出栅格表面，其值表示根据参考表面归一化的输入表面。正值表示输入曲面位于参照曲面上方的区域，而负值表示输入曲面位于参照曲面下方的区域。栅格的值是从使用线性插值的 TIN 派生的。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Raster")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _out_raster { get; set; } = null;


        /// <summary>
        /// <para>Raster Cell Size</para>
        /// <para>The cell size of the output raster.</para>
        /// <para>输出栅格的像元大小。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Raster Cell Size")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _raster_cell_size { get; set; } = 10;


        /// <summary>
        /// <para>Output TIN Folder</para>
        /// <para>The folder location for storing one or more TIN surfaces whose values represent the difference between the input and reference surface.</para>
        /// <para>用于存储一个或多个 TIN 曲面的文件夹位置，其值表示输入曲面和参照曲面之间的差值。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output TIN Folder")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _out_tin_folder { get; set; } = null;


        /// <summary>
        /// <para>Output TIN Base Name</para>
        /// <para>The base name given to each output TIN surface. If one TIN dataset is not sufficient to represent the data, multiple TINs will be created with the same base name.</para>
        /// <para>为每个输出 TIN 表面指定的基本名称。如果一个 TIN 数据集不足以表示数据，则将创建多个具有相同基本名称的 TIN。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output TIN Base Name")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _out_tin_basename { get; set; } = null;


        /// <summary>
        /// <para>LAS Thinning Method</para>
        /// <para><xdoc>
        ///   <para>The method used to select a LAS point in each analysis window when applying an analysis resolution to thin the input LAS dataset surface. The resulting points will be used to construct a triangulated surface.</para>
        ///   <bulletList>
        ///     <bullet_item>Closest to mean—The LAS point whose value is closest to the mean of all LAS points in the analysis window will be used. This is the default.</bullet_item><para/>
        ///     <bullet_item>Minimum—The LAS point with the smallest z-value among all the LAS points in the analysis window.</bullet_item><para/>
        ///     <bullet_item>Maximum—The LAS point with the highest z-value among all the LAS points in the analysis window.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>应用分析分辨率以缩小输入 LAS 数据集表面时，用于在每个分析窗口中选择 LAS 点的方法。生成的点将用于构建三角化曲面。</para>
        ///   <bulletList>
        ///     <bullet_item>最接近均值—将使用其值最接近分析窗口中所有 LAS 点的平均值的 LAS 点。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>最小值 - 在分析窗口中所有 LAS 点中 z 值最小的 LAS 点。</bullet_item><para/>
        ///     <bullet_item>最大值 - 在分析窗口中所有 LAS 点中具有最高 z 值的 LAS 点。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("LAS Thinning Method")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _method_value _method { get; set; } = _method_value._CLOSEST_TO_MEAN;

        public enum _method_value
        {
            /// <summary>
            /// <para>Minimum</para>
            /// <para>Minimum—The LAS point with the smallest z-value among all the LAS points in the analysis window.</para>
            /// <para>最小值 - 在分析窗口中所有 LAS 点中 z 值最小的 LAS 点。</para>
            /// </summary>
            [Description("Minimum")]
            [GPEnumValue("MIN")]
            _MIN,

            /// <summary>
            /// <para>Maximum</para>
            /// <para>Maximum—The LAS point with the highest z-value among all the LAS points in the analysis window.</para>
            /// <para>最大值 - 在分析窗口中所有 LAS 点中具有最高 z 值的 LAS 点。</para>
            /// </summary>
            [Description("Maximum")]
            [GPEnumValue("MAX")]
            _MAX,

            /// <summary>
            /// <para>Closest to mean</para>
            /// <para>Closest to mean—The LAS point whose value is closest to the mean of all LAS points in the analysis window will be used. This is the default.</para>
            /// <para>最接近均值—将使用其值最接近分析窗口中所有 LAS 点的平均值的 LAS 点。这是默认设置。</para>
            /// </summary>
            [Description("Closest to mean")]
            [GPEnumValue("CLOSEST_TO_MEAN")]
            _CLOSEST_TO_MEAN,

        }

        /// <summary>
        /// <para>Reference LAS Thinning Method</para>
        /// <para><xdoc>
        ///   <para>The method used to select a LAS point in each analysis window when applying an analysis resolution to thin the input LAS dataset surface. The resulting points will be used to construct a triangulated surface.</para>
        ///   <bulletList>
        ///     <bullet_item>Closest to mean—The LAS point whose value is closest to the mean of all LAS points in the analysis window will be used. This is the default.</bullet_item><para/>
        ///     <bullet_item>Minimum—The LAS point with the smallest z-value among all the LAS points in the analysis window.</bullet_item><para/>
        ///     <bullet_item>Maximum—The LAS point with the highest z-value among all the LAS points in the analysis window.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>应用分析分辨率以缩小输入 LAS 数据集表面时，用于在每个分析窗口中选择 LAS 点的方法。生成的点将用于构建三角化曲面。</para>
        ///   <bulletList>
        ///     <bullet_item>最接近均值—将使用其值最接近分析窗口中所有 LAS 点的平均值的 LAS 点。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>最小值 - 在分析窗口中所有 LAS 点中 z 值最小的 LAS 点。</bullet_item><para/>
        ///     <bullet_item>最大值 - 在分析窗口中所有 LAS 点中具有最高 z 值的 LAS 点。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Reference LAS Thinning Method")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _reference_method_value _reference_method { get; set; } = _reference_method_value._CLOSEST_TO_MEAN;

        public enum _reference_method_value
        {
            /// <summary>
            /// <para>Minimum</para>
            /// <para>Minimum—The LAS point with the smallest z-value among all the LAS points in the analysis window.</para>
            /// <para>最小值 - 在分析窗口中所有 LAS 点中 z 值最小的 LAS 点。</para>
            /// </summary>
            [Description("Minimum")]
            [GPEnumValue("MIN")]
            _MIN,

            /// <summary>
            /// <para>Maximum</para>
            /// <para>Maximum—The LAS point with the highest z-value among all the LAS points in the analysis window.</para>
            /// <para>最大值 - 在分析窗口中所有 LAS 点中具有最高 z 值的 LAS 点。</para>
            /// </summary>
            [Description("Maximum")]
            [GPEnumValue("MAX")]
            _MAX,

            /// <summary>
            /// <para>Closest to mean</para>
            /// <para>Closest to mean—The LAS point whose value is closest to the mean of all LAS points in the analysis window will be used. This is the default.</para>
            /// <para>最接近均值—将使用其值最接近分析窗口中所有 LAS 点的平均值的 LAS 点。这是默认设置。</para>
            /// </summary>
            [Description("Closest to mean")]
            [GPEnumValue("CLOSEST_TO_MEAN")]
            _CLOSEST_TO_MEAN,

        }

        /// <summary>
        /// <para>Processing Extent</para>
        /// <para><xdoc>
        ///   <para>The extent of the data that will be evaluated.</para>
        ///   <bulletList>
        ///     <bullet_item>Default—The extent will be based on the maximum extent of all participating inputs. This is the default.</bullet_item><para/>
        ///     <bullet_item>Union of Inputs—The extent will be based on the maximum extent of all inputs.</bullet_item><para/>
        ///     <bullet_item>Intersection of Inputs—The extent will be based on the minimum area common to all inputs.</bullet_item><para/>
        ///     <bullet_item>Current Display Extent—The extent is equal to the visible display. The option is not available when there is no active map.</bullet_item><para/>
        ///     <bullet_item>As Specified Below—The extent will be based on the minimum and maximum extent values specified.</bullet_item><para/>
        ///     <bullet_item>Browse—The extent will be based on an existing dataset.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>将评估的数据范围。</para>
        ///   <bulletList>
        ///     <bullet_item>默认值 - 范围将基于所有参与输入的最大范围。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>输入并集 - 范围将基于所有输入的最大范围。</bullet_item><para/>
        ///     <bullet_item>输入交点 - 范围将基于所有输入共有的最小面积。</bullet_item><para/>
        ///     <bullet_item>当前显示范围 - 范围等于可见显示。当没有活动地图时，该选项不可用。</bullet_item><para/>
        ///     <bullet_item>如下所述 - 范围将基于指定的最小和最大范围值。</bullet_item><para/>
        ///     <bullet_item>浏览 - 范围将基于现有数据集。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Processing Extent")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _extent { get; set; } = null;


        /// <summary>
        /// <para>Processing Boundary</para>
        /// <para>A polygon feature that defines the area of interest to be processed.</para>
        /// <para>定义要处理的感兴趣区域的面要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Processing Boundary")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _boundary { get; set; } = null;


        public SurfaceDifference SetEnv(object XYDomain = null, object XYResolution = null, object XYTolerance = null, int? autoCommit = null, object configKeyword = null, object extent = null, object geographicTransformations = null, object outputCoordinateSystem = null, object terrainMemoryUsage = null, object workspace = null)
        {
            base.SetEnv(XYDomain: XYDomain, XYResolution: XYResolution, XYTolerance: XYTolerance, autoCommit: autoCommit, configKeyword: configKeyword, extent: extent, geographicTransformations: geographicTransformations, outputCoordinateSystem: outputCoordinateSystem, terrainMemoryUsage: terrainMemoryUsage, workspace: workspace);
            return this;
        }

    }

}